package CodingTest.AC20190307; /**
 * describe:
 *
 * @author chaP
 * @date 2019/03/08
 */

import java.util.Arrays;

/**
 * 题目描述
 汇编语言中有一种移位指令叫做循环左移（ROL），现在有个简单的任务，
 就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S，请你把其循环左移K位后的序列输出。
 例如，字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果，即“XYZdefabc”。是不是很简单？OK，搞定它！
 */
public class LeftRotateString {
//    解法一：
   public String LeftRotateString(String str,int n){
       if(str.length() == 0) return null;
       StringBuffer s = new StringBuffer(str);
       int k = n;
       if(n>str.length()){
           k = n%str.length();
       }
       // public String substring(int beginIndex, int endIndex)
       //返回一个新字符串，它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始， endIndex:到指定的 endIndex-1处结束。
       s.append(s.substring(0,n));
       str = s.substring(n,s.length());
       return str;


   }
// 解法二：

    /**
     * 链接：https://www.nowcoder.com/questionTerminal/12d959b108cb42b1ab72cef4d36af5ec
     来源：牛客网

     假设字符串abcdef，n=3，设X=abc，Y=def，所以字符串可以表示成XY，
     如题干，问如何求得YX。假设X的翻转为XT，XT=cba，同理YT=fed，那么YX=(XTYT)T，三次翻转后可得结果。
     *
     */
    public String LeftRotateString2(String str,int n){
        if(str.length() == 0) return str;
        String str1 = reverse(str.substring(0,n));
        String str2 = reverse(str.substring(n,str.length()));
        str = reverse(str1+str2);
        return str;
    }
    public String reverse(String str){
        char[] ch = str.toCharArray();
        int low = 0;
        int high = str.length()-1;
        while(low < high){
            char temp = ch[low];
            ch[low] = ch[high];
            ch[high] = temp;
            low ++;
            high --;

        }
       return new String(ch);
    }

    public static void main(String[] args) {
        LeftRotateString lr = new LeftRotateString();
        System.out.println(lr.LeftRotateString2("",2));
    }
}